package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import java.util.ArrayList;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanVaga;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.WindowResizeListener;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;

public class AListaVagasEncerradas extends DockPanel implements WindowResizeListener
{
	private ADetalhesVagaEmpresa viewDetalhesVagaEmpresa;
	
	private static int pastRow = -1;
	private FlexTable resultadoGrid;
	private BeanVaga bVaga;

	public AListaVagasEncerradas(BeanEmpresaAssinante bEmpresaAssinante)
	{
		this.bVaga = new BeanVaga();
		this.bVaga.setEncerrada(true);
		this.bVaga.setBEmpresaAssinante(bEmpresaAssinante);		
		
		AsyncCallback<ArrayList<BeanVaga>> consultaVagas = new AsyncCallback<ArrayList<BeanVaga>>()
		{
			public void onSuccess(ArrayList<BeanVaga> clVagas)
			{
				int linha = 1;

				for (BeanVaga vaga : clVagas)
				{
					resultadoGrid.setWidget(linha, 0, new HTML(vaga.getId() + ""));
					resultadoGrid.setWidget(linha, 1, new HTML(vaga.getBEmpresaAssinante().getRazaoSocial()));
					resultadoGrid.setWidget(linha, 2, new HTML(vaga.getCargo()));
					resultadoGrid.setWidget(linha, 3, new HTML(vaga.getRemuneracao() + ""));

					// esconde o campo de id da vaga na tabela
					resultadoGrid.getFlexCellFormatter().setVisible(linha++, 0, false);
				}
				addContagem(clVagas.size());
			}

			public void onFailure(Throwable caught)
			{
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao buscar vagas: " + caught.getMessage());
				caught.printStackTrace();
				errorDialogBox.center();
				errorDialogBox.show();
			};
		};
		
		Util.getService().buscarVagas(AListaVagasEncerradas.this.bVaga, consultaVagas);
		
		resultadoGrid = new FlexTable();
		resultadoGrid.setCellPadding(7);
		resultadoGrid.setCellSpacing(0);
		resultadoGrid.setWidth("100%");
		
		Window.addWindowResizeListener(this);
		DeferredCommand.addCommand(new Command(){
			public void execute() {
			  onWindowResized(Window.getClientWidth(), Window.getClientHeight());	
			}
		});		
		onWindowResized(Window.getClientWidth(), Window.getClientHeight());
		
		
		setarEstiloGrid();

		// COLUNAS DA GRID
		resultadoGrid.setWidget(0, 0, new HTML("ID da Vaga"));
		resultadoGrid.setWidget(0, 1, new HTML("Empresa"));
		resultadoGrid.setWidget(0, 2, new HTML("Cargo"));
		resultadoGrid.setWidget(0, 3, new HTML("Remuneração"));

		// esconde a coluna de id da vaga
		resultadoGrid.getFlexCellFormatter().setVisible(0, 0, false);

		AListaVagasEncerradas.this.add(resultadoGrid, DockPanel.CENTER);
		
		resultadoGrid.addTableListener(
			new TableListener()
			{
				public void onCellClicked(SourcesTableEvents sender, int row, int cell)
				{
					// se nao for os campos da grid
					if (row != 0 && row != resultadoGrid.getRowCount() - 1)
					{
						setarEstiloLinhaSelecionada(row);

						Integer idVaga = Integer.parseInt(((HTML) resultadoGrid.getWidget(row, 0)).getHTML());

						if (viewDetalhesVagaEmpresa == null)
						{
							viewDetalhesVagaEmpresa = new ADetalhesVagaEmpresa(idVaga, AListaVagasEncerradas.this);
							AListaVagasEncerradas.this.add(viewDetalhesVagaEmpresa, DockPanel.SOUTH);
						    
						}
						else
						{
							AListaVagasEncerradas.this.remove(viewDetalhesVagaEmpresa);

							viewDetalhesVagaEmpresa = new ADetalhesVagaEmpresa(idVaga, AListaVagasEncerradas.this);
							AListaVagasEncerradas.this.add(viewDetalhesVagaEmpresa, DockPanel.SOUTH);
						}
					}
					
				}
			}
		);
		
	}

	private void addContagem(int totalResultado)
	{
		resultadoGrid.setWidget(resultadoGrid.getRowCount(), 0, new HTML("Total de vagas encontradas: " + totalResultado));
		resultadoGrid.getFlexCellFormatter().setColSpan(resultadoGrid.getRowCount() - 1, 0, 4);
		resultadoGrid.getFlexCellFormatter().setAlignment(resultadoGrid.getRowCount() - 1, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		resultadoGrid.getFlexCellFormatter().setStyleName(resultadoGrid.getRowCount() - 1, 0, "resultadoGridContagem");
	}
	
	private void setarEstiloGrid()
	{
		resultadoGrid.getFlexCellFormatter().setStyleName(0, 0, "gridCampos");
		resultadoGrid.getFlexCellFormatter().setStyleName(0, 1, "gridCampos");
		resultadoGrid.getFlexCellFormatter().setStyleName(0, 2, "gridCampos");
		resultadoGrid.getFlexCellFormatter().setStyleName(0, 3, "gridCampos");
		
		resultadoGrid.setStyleName("grid");
	}
	
	private void setarEstiloLinhaSelecionada(int row)
	{
		if (pastRow != -1)
		{
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 0, "resultadoGridLinhaNaoSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 1, "resultadoGridLinhaNaoSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 2, "resultadoGridLinhaNaoSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 3, "resultadoGridLinhaNaoSelecionada");			
		}

		resultadoGrid.getFlexCellFormatter().setStyleName(row, 0, "resultadoGridLinhaSelecionada");
		resultadoGrid.getFlexCellFormatter().setStyleName(row, 1, "resultadoGridLinhaSelecionada");
		resultadoGrid.getFlexCellFormatter().setStyleName(row, 2, "resultadoGridLinhaSelecionada");
		resultadoGrid.getFlexCellFormatter().setStyleName(row, 3, "resultadoGridLinhaSelecionada");

		pastRow = row;
	}

	public void onWindowResized(int width, int height) {
		int largura = width - this.getAbsoluteLeft() - 9;
		if(largura < 1){
			largura = 1;
		}
		
		int altura = height - this.getAbsoluteTop() - 9;
		if(altura < 1){
			altura = 1;
		}
		
		this.setPixelSize(largura, altura);
	}
}